package com.qf.efserver.login.service.impl;


import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.RandomUtil;
import com.qf.common.core.enums.RedisKeyEnum;
import com.qf.common.redis.utils.RedisUtils;
import com.qf.common.sms.enums.SmsEnum;
import com.qf.common.sms.utils.AliSmsUtils;
import com.qf.efserver.login.service.SMSCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Author hehecheng
 * Date 2024/10/28
 * 祝我们都能遇见真诚的人
 * 见字如面
 */
@Service
@Slf4j
public class SMSCodeServiceImpl implements SMSCodeService {

    @Resource
    private ThreadPoolExecutor threadPoolExecutor;

    /**
     * 注册验证码
     *
     * @param phone 手机号
     */
    @Override
    public String GetCode(String phone) {

        // 验证手机号是否合法
        boolean isMobile = Validator.isMobile(phone);
        if (!isMobile) {
            throw new RuntimeException("手机号不正确");
        }

        // 判断次数
        String numKey = String.format(RedisKeyEnum.KEY_CODE_NUM.getKey(), phone);

        // TODO 存在高并发问题
        if (RedisUtils.hasKey(numKey)) {
            Long newLong = RedisUtils.incrValue(numKey, 1L);
            if (newLong > 3) {
                throw new RuntimeException("验证码请求次数过多");
            }
        } else {
            RedisUtils.setValueTimeout(numKey, 1, RedisKeyEnum.KEY_CODE_NUM.getTimeout());
        }

        // 生成随机验证码
        String code = RandomUtil.randomNumbers(6);

        // 将验证码存入redis
        String key = String.format(RedisKeyEnum.KEY_CODE.getKey(), phone);
        RedisUtils.setValueTimeout(key, code, RedisKeyEnum.KEY_CODE.getTimeout());

        //异步发送短信(线程、MQ)
//        threadPoolExecutor.execute(() -> {
//            //发送短信
//            AliSmsUtils.sendSms(
//                    SmsEnum.SMS_LOGIN.getSignName(),
//                    SmsEnum.SMS_LOGIN.getTemplateCode(),
//                    phone, code);
//        });

        return code;
    }
}
